package com.atguigu.redis7.service;

import cn.hutool.core.date.DateUtil;
import com.atguigu.redis7.entities.Product;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * @版本： V5.1.0
 * @版权： Copyright @ 2025 广东广昱信息科技有限公司版权所有
 * @作者： 广东广昱信息科技有限公司
 * @日期： 2025-07-13 20:31
 */
@Service
@Slf4j
public class JHSTaskService {
    public static final String JHS_KEY = "jhs";
    public static final String JHS_KEY_A = "jhs:a";
    public static final String JHS_KEY_B = "jhs:b";
    @Resource
    private RedisTemplate redisTemplate;


    private List<Product> getProductsFromMyql(){
        List<Product> list = new ArrayList<>();
        for(int i = 1;i <= 20;i++){
            Random random = new Random();
            int id = random.nextInt(10000);
            Product obj = new Product((long)id,"商品"+i,i,"商品描述"+i);
            list.add(obj);
        }
        return list;
    }
    //@PostConstruct
    public void initJHS(){
        log.info("启动定时器天猫聚划算功能模拟开始......,O(n_n)o哈哈~");
        new Thread(() -> {
           while (true){
               //2.模拟从mysql查出数据,用于加载到redis并给聚划算页面显示
               List<Product> list = this.getProductsFromMyql();
               //3.采用redis list数据结构的lpush命令来实现存储
               redisTemplate.delete(JHS_KEY);
               //4.加入最新数据给redis参加活动
               redisTemplate.opsForList().leftPushAll(JHS_KEY,list);
               //5 暂停1分钟线程，间隔一分钟执行一次，模拟聚划算一天执行的参加活动的品牌
               try {
                   TimeUnit.MINUTES.sleep(1);
               }catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
        },"t1").start();
    }

    @PostConstruct
    public void initJHSAB(){
        log.info("启动AB定时器计划任务淘宝聚划算功能模拟....."+ DateUtil.now());
        new Thread(() -> {
            while (true){
                //2.模拟从mysql查出数据,用于加载到redis并给聚划算页面显示
                List<Product> list = this.getProductsFromMyql();
                //3.先更新B缓存且让B缓存过期时间超过A缓存，如果A突然失效了还有B兜底，防止击穿
                redisTemplate.delete(JHS_KEY_B);
                redisTemplate.opsForList().leftPushAll(JHS_KEY_B,list);
                redisTemplate.expire(JHS_KEY_B,86410L, TimeUnit.SECONDS);
                //4.更新A缓存，且让A缓存过期时间短于B缓存，如果A缓存失效，B缓存可以继续使用
                redisTemplate.delete(JHS_KEY_A);
                redisTemplate.opsForList().leftPushAll(JHS_KEY_A,list);
                redisTemplate.expire(JHS_KEY_A,86400L, TimeUnit.SECONDS);

                //5 暂停1分钟线程，间隔一分钟执行一次，模拟聚划算一天执行的参加活动的品牌
                try {
                    TimeUnit.MINUTES.sleep(1);
                }catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"t1").start();


    }
}
